// "off" or 0 - turn the rule off
// "warn" or 1 - turn the rule on as a warning (doesn’t affect exit code)
// "error" or 2 - turn the rule on as an error (exit code is 1 when triggered)

// 1.整个文件不校验
// 在文件最顶部写上/* eslint-disable */
//
// 2.对某个代码块不校验
// 使用/* eslint-disable */和/* eslint-enable */包起来

// 3.对指定的行不校验
// 有两种方式
// 一种是:
// console.log(1) // eslint-disable-line;
// 另外一种是:
// // eslint-disable-next-line
// console.log（1）

// 4.以上是对所有规则都不校验，那如果只是想针对某个或者某些规则不校验的，就可以在后面单独加上该规则，例如上面说的UNSAFE_componentWillReceiveProps
// // eslint-disable-next-line camelcase ...其他规则
// UNSAFE_componentWillReceiveProps = () => {}

module.exports = {
  root: true,
  // extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
  // parserOptions: { project: ["./tsconfig.json"] },
  // plugins: ["@typescript-eslint"],

  parser: "@babel/eslint-parser", // "@typescript-eslint/parser",
  parserOptions: {
    requireConfigFile: true,
    babelOptions: {
      babelrc: false,
      // your babel options
      // presets: ["@babel/preset-env"],
      configFile: "./babel.config.js",
    },
    ecmaVersion: 6,
    ecmaFeatures: {
      jsx: true,
    },
  },
  extends: ["eslint:recommended"],
  plugins: ["import"], // fix: error Definition for rule 'import/no-mutable-exports' was not found
  env: {
    browser: true,
    node: true,
  },
  rules: {
    "no-console": process.env.NODE_ENV === "production" ? "error" : "warn",
    "no-debugger": process.env.NODE_ENV === "production" ? "error" : "warn",
    // 建议使用分号结尾
    semi: "error",
    // 禁止使用 var
    "no-var": "error",
    // 建议使用const
    "prefer-const": "error",
    // 禁止修改使用const（no-const-assign）声明的变量
    "no-const-assign": "error",
    // 方法属性值简写
    "object-shorthand": "error",
    // 只对那些无效的标示使用引号 ''
    "quote-props": ["error", "as-needed"],
    // 数组要求字面量赋值
    "no-array-constructor": "error",
    // 对象要求字面值创建对象
    "no-new-object": "error",
    // 在数组方法的回调中强制执行
    "array-callback-return": "error",
    // string 统一双引号 ''
    quotes: ["error", "double"], // single
    // 建议使用模板字符串
    "prefer-template": "error",
    // 禁止使用eval
    "no-eval": "error",
    // 不要使用不必要的转义字符
    "no-useless-escape": "error",
    // 用命名函数表达式而不是函数声明
    // "func-style": "error",
    // allowArrowFunctions 函数声明方式定义函数 funciton xxx() {}
    "func-style": ["error", "declaration", { allowArrowFunctions: true }],
    // 建议使用rest参数而不是参数
    "prefer-rest-params": "error",
    // 函数前不允许使用空格或
    "space-before-function-paren": ["error", "never"],
    // 块前需要空格
    "space-before-blocks": ["error", "always"],
    // 不允许重新分配函数参数
    "no-param-reassign": "error",
    // 建议使用spread语法而不是.apply（）
    "prefer-spread": "error",
    // 建议使用箭头函数
    "prefer-arrow-callback": "error",
    // 箭头函数的箭头前后需要空格
    "arrow-spacing": "error",
    // 不允许箭头函数与比较混淆
    "no-confusing-arrow": [
      "error",
      {
        allowParens: true,
      },
    ],
    // 不允许不必要的构造函数
    "no-useless-constructor": "error",
    // 不允许在类成员中使用重复名称
    "no-dupe-class-members": "error",
    // 不允许重复导入
    "no-duplicate-imports": [
      "error",
      {
        includeExports: true,
      },
    ],
    // 不要导出可变的绑定
    "import/no-mutable-exports": "error",
    // import 放在其他所有语句之前
    "import/first": "error",
    // 访问属性时使用点符号
    "dot-notation": "error",
    // 做幂运算时用幂操作符 **
    "no-restricted-properties": "error",
    // 不要使用连续变量分配
    "no-multi-assign": "error",
    // 不允许有未使用的变量
    "no-unused-vars": "error",
    // 使用 === 和 !== 而不是 == 和 !=
    eqeqeq: ["error", "always"],
    // 不允许在case/default子句中使用词法声明
    "no-case-declarations": "error",
    // 三元表达式不应该嵌套，通常是单行表达式
    "no-nested-ternary": "error",
    // 避免不需要的三元表达式
    "no-unneeded-ternary": "error",
    // 不允许不同运算符的混合
    "no-mixed-operators": "error",
    // 强制单行语句的位置
    "nonblock-statement-body-position": ["error", "beside"],
    // 需要大括号样式
    "brace-style": "error",
    // 如果if语句都要用return返回，那后面的else就不用写了。如果if块中包含return，它后面的else if块中也包含了return，这个时候就可以把else if拆开
    "no-else-return": "error",
    // 强制2个空格
    indent: [
      "error",
      2,
      {
        SwitchCase: 1,
      },
    ],
    // 在关键字前后强制使用一致的间距
    "keyword-spacing": [
      "error",
      {
        before: true,
      },
    ],
    // 用空格来隔开运算符
    "space-infix-ops": [
      "error",
      {
        int32Hint: false,
      },
    ],
    // 不要故意留一些没必要的空白行
    "padded-blocks": ["error", "never"],
    // 方括号里不要加空格
    "array-bracket-spacing": ["error", "never"],
    // 花括号 {} 里加空格
    "object-curly-spacing": ["error", "always"],
    // , 前避免空格， , 后需要空格
    "comma-spacing": [
      "error",
      {
        before: false,
        after: true,
      },
    ],
    // 在对象的属性中， 键值之间要有空格
    "key-spacing": [
      "error",
      {
        beforeColon: false,
      },
    ],
    // 行末不要空格
    "no-trailing-spaces": "error",
    // 避免出现多个空行。 最多两个空行，在文件末尾只允许空一行
    "no-multiple-empty-lines": ["error", { max: 2, maxEOF: 1 }],
    // 不允许基元包装实例
    "no-new-wrappers": "error",
    // 需要基数参数
    radix: ["error", "as-needed"],
    // 要求驼峰式命名对象、函数、实例
    camelcase: [
      "error",
      {
        properties: "always",
      },
    ],
    // 要求构造函数名称以大写字母开头
    "new-cap": "error",
    // 注释规范
    "spaced-comment": [
      "error",
      "always",
      {
        line: {
          markers: ["/"],
          exceptions: ["-", "+"],
        },
        block: {
          markers: ["!"],
          exceptions: ["*"],
          balanced: true,
        },
      },
    ],
  },

  globals: {
    /*
      readonly/false——只读
      writable/true——可写
      off——禁用该全局变量
      说明：true/false 等价于只读/可写，但不推荐使用。详见ESLint官网
    */
    NODE_ENV: "readonly",
  },
};
